''' 
布局管理器
几何管理
Tkinter控件有特定的几何状态管理方法，管理整个控件区域组织，
以下是Tkinter公开的几何管理类：包、网格、位置

几何方法	     描述     备注
pack()	      包装     于grid相比是简单布局，如果要进行复杂布局需要结合Frame框架组件或者grid布局管理器实现。同一个父组件里面，不要pack和grid混用。 
grid()	      网格
place()	      位置

总结：
pack：按照组件放置的前后顺序从上到下排列。
grid：是格子的意思，它是按照行和列的方式来排列。
place：允许通过程序指定组件的绝对位置或者相对于其他组件的位置。

包装器

包装器是 Tk 的形状管理机制之一。 
形状管理器用于指定部件在容器内的相对位置——彼此的 宿主 关系。
与更为麻烦的 定位器 相比（不太常用，这里不做介绍），包装器可接受定性的相对关系—— 上面 、左边 、填充 等，并确定精确的放置坐标。

主 部件的大小都由其内部的 “从属部件” 的大小决定。
包装器用于控制从属部件在主部件中出现的位置。
可以把部件包入框架，再把框架包入其他框架中，搭建出所需的布局。
此外，只要完成了包装，组件的布局就会进行动态调整，以适应布局参数的变化。

请注意，只有用形状管理器指定几何形状后，部件才会显示出来。
忘记设置形状参数是新手常犯的错误，惊讶于创建完部件却啥都没出现。
部件只有在应用了类似于打包器的 pack() 方法之后才会显示在屏幕上。

调用 pack() 方法时可以给出由关键字/参数值组成的键值对，以便控制组件在其容器中出现的位置，以及主程序窗口大小变动时的行为。
以下是参数可选值：

anchor
锚点类型。 表示包装器要放置的每个从属组件的位置。

expand
布尔型，0 或 1 。 是否将父组件的额外空间填充满

fill
合法值为：'x' 、'y' 、'BOTH' 、'none'。  以特定方向填充

ipadx 和 ipady
距离值，指定从属部件每一侧的内边距。

padx 和 pady
距离值，指定从属部件的外边距。

side
合法值为：'left'、 'right' 、 'top'、 'bottom'。


下面是一些例子：
'''

from tkinter import *

root = Tk()
root.title("pack")
root.geometry("600x600")

''' fred = Button(root, text="包装器", fg="red", bg="blue")
fred["fg"] = "red"
fred["bg"] = "blue"
fred.config(fg="red", bg="blue")

fred.pack()                     # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1) '''


''' 
pack场景：
1.将组件放到Frame框架组件或者其他容器组建中，并使其填充满整个父组件
'''

label_1 = Label(root, text = "one", bg = "blue")
label_1.pack(fill = BOTH, expand = 1)

label_2 = Label(root, text = "two", bg = "green")
label_2.pack(fill = BOTH, expand = 1)

''' 
2.纵向排列组件
默认情况下，pack()就是纵向排列， 使用fill="x"，可以填充满 横向空间
'''
label_3 = Label(root, text = "three", bg = "red")
label_3.pack(fill = "x")

label_4 = Label(root, text = "four", bg = "pink")
label_4.pack(fill = "x")

label_5 = Label(root, text = "five", bg = "yellow")
label_5.pack(fill = "x")

''' 
3.横向挨个排列
需要依靠side属性完成
'''

label_6 = Label(root, text = "six", bg = "pink")
label_6.pack(side="left", fill="y")

label_7 = Label(root, text = "seven", bg = "green")
label_7.pack(side="left", fill="y")

label_8 = Label(root, text = "eight", bg = "yellow")
label_8.pack(side="left", fill="y")

root.mainloop()
